/**
 * @desc 订单类
 */
import OrderDetail from "./OrderDetail";

class Order2 {
  // TS4之前针对
  // 没有初始化的值，也没有在构造函数中明确给这个赋值的一种解决方案
  // 增加undefined类型
  public orderId!: number | undefined; // 使用联合类型 undefined 会让程序存在一些风险
  public date: Date | undefined; // 这种定义的形式有一种使用场景：在构造函数中不传入并且也不赋予初值，但是我在类中又想定义这个变量可以在某个方法中去使用
  public custname!: string; // TS4之后取代`| undefined`这种写法，加了 ! 号之后我们的TS编译器不会对它进行检测
  public phone: string | undefined;
  public price!: number;
  public count!: number;
  public orderDetail: Array<OrderDetail> = [];

  constructor(
    orderId_: number,
    date_: Date,
    custname_: string,
    phone_: string,
    price_: number,
    count_: number,
    orderDetail_: Array<OrderDetail>
  ) {
    /* this.orderId = orderId_; // 构造函数中不赋值
    this.date = date_;
    this.custname = custname_;
    this.phone = phone_;
    this.orderDetail = orderDetail_; */
  }

  public getTotal(): number {
  // 使用 ! 下面的语句不会报错，使用 | undefined 下面语句会报错
    return this.price * this.count; // 会出现对象未定义的错误，也就是说一个联合类型当中如果有 undefined 的话它是不允许你这样像数字一样的相乘的，两个undefined是不能相乘的，你的对象都未定义你的值怎么能相乘呢
  }
}
let orderDetailOne = new OrderDetail(10, "电视机", 5000, 3);
let orderDetailTwo = new OrderDetail(11, "桌子", 2000, 2);
let orderDetailArray: Array<OrderDetail> = [orderDetailOne, orderDetailTwo];
let orderDate = new Date(2023, 10, 17, 5, 20, 0);
let order = new Order2(1, orderDate, "李武", "333",1,2, orderDetailArray);

console.log(order);
console.log(order.getTotal()); // NaN
console.log(typeof order.price); // undefined
// 输出：
// Order2
//  |-orderDetail: []
//  |-[[Prototype]]: Object
// 相当于上面设置联合类型为 undefined 的变量如果在构造函数中也没有初始化的话在输出 `order` 对象时是不会输出的
